package com.demo.socket;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

/**
 * 客户端发送 "hello server" 到服务端
 * @author gy
 * @date 2022/5/4
 */
public class SocketTCP03Client {
    public static void main(String[] args) throws IOException {
        // 思路
        // 1、连接服务器（ip、端口）
        // 解读：连接本机的 9999端口，如果连接成功，返回Socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("客户端的 socket = "+socket.getClass());

        // 2、连接上后生成Socket，通过socket.getOutputStream
        //得到 和 socket 关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();

        // 3、通过输出流，写入数据到 数据通道  要求：使用字符流
        // 将字节流转换为字符流
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
        // 创建 字符包装流、也叫处理流，调用相关api
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        bufferedWriter.write("hello server 字符流");
        // 插入换行符，表示写入的内容结束；注意：此时要求对方使用readLine读取！！！！
        bufferedWriter.newLine();
        // 如果使用的是字符流，需要手动刷新，否则数据不会写入到数据通道
        bufferedWriter.flush();

        // 4、获取和socket相关的输入流（字符），读取数据并显示
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        // 5、关闭 流对象 和 socket
        // 注意直接关闭外层流 后打开的先关闭
        bufferedReader.close();
        // 注意直接关闭外层流
        bufferedWriter.close();
        socket.close();
        System.out.println("客户端退出了。。。。");
    }
}
